#include<stdio.h>

#define TAMANHO 5

 //Programa modificado agora quando lista a venda  mostra codigo e nome do remedio

typedef struct cliente{
    int codigo;
    char nome [50];
}Cliente;

typedef struct remedio{
    int codigo;
    char nome [50];
    float preco;
}Remedio;

typedef struct venda{
    int codigo_cliente;
    int codigo_remedio;

}Venda;

Cliente clientes[TAMANHO];
Remedio remedios[TAMANHO];
Venda vendas[TAMANHO];

int indiceCliente = -1;
int indiceRemedio = -1;
int indiceVenda = -1;

int menu();
void cadastraCliente();
void listarCliente();
void cadastraRemedio();
void listarRemedio();
void realizarVenda();
void listarVenda();
void calcularTotalVendas();
void listarDoisMaisCaros();
void deletarCliente();
void deletarRemedio();


int naoExisteClienteCadastrado(int codigo);
int main(){
    puts("##################");
    puts("#Programa Inicial#");
    puts("#---Drograria----#");
    puts("##################\n");

    int opcao = -1;

    while (opcao != 0){
        opcao = menu();

        switch(opcao){
        case 1:
            cadastraCliente();
            break;
        case 2:
            listarCliente();
            break;
        case 3:
            cadastraRemedio();
            break;
        case 4:
            listarRemedio();
            break;
        case 5:
            realizarVenda();
            break;
        case 6:
            listarVenda();
            break;
        case 7:
            calcularTotalVendas();
            break;
        case 8:
            listarDoisMaisCaros();
            break;
        case 9:
            deletarCliente();
            break;
        case 10:
            deletarRemedio();
            break;

        default:
            puts("Opcao invalida!");
            break;
        }

    }
}

int menu(){
    int opcao;
    puts("Menu");
    puts(" 1 - Cadastrar Cliente");
    puts(" 2 - Listar Cliente");
    puts(" 3 - Cadastrar Remedio");
    puts(" 4 - Listar Remedio");
    puts(" 5 - Realizar venda");
    puts(" 6 - Listar venda");
    puts(" 7 - Total de vendas em R$");
    puts(" 8 - Listar os 2 Remedios mais caros");
    puts(" 9 - Deletar Arquivos do Cliente");
    puts(" 10- Deletar Arquivos de Remedio");
    puts(" 0 - Sair do Sistema");
    scanf("%d", &opcao);
    return opcao;
}

void listarDoisMaisCaros(){
    int i, caro1 = 0, caro2 = 0;
    system("cls");
    if (indiceRemedio== -1 ){
        puts("Nao existem Remedio cadastrados");
        return;
    }

    for (i = 0 ; i <= indiceRemedio ; i++){
        if (remedios[i].preco > remedios[caro1].preco ){
            caro1 = i;
        }
    }

    for (i = 0 ; i <= indiceRemedio ; i++){
        if (i != caro1 && remedios[i].preco > remedios[caro2].preco ){
            caro2 = i;
        }
    }

    printf("%s custa R$%f\n", remedios[caro1].nome, remedios[caro1].preco);
    printf("%s custa R$%f\n", remedios[caro2].nome, remedios[caro2].preco);
}

void calcularTotalVendas(){
    float total = 0;
    int i, j;
    system("cls");
    if (indiceVenda == -1 ){
        puts("Nao existem vendas realizadas ");
        return;
    }
    for (i = 0 ; i <= indiceVenda ; i++){
        for (j = 0 ; j <= indiceRemedio ; j++){
            if (remedios[j].codigo == vendas[i].codigo_remedio){
                total = total + remedios[j].preco;
                break;
            }
        }
    }
    printf("Total de vendas eh: %f\n", total);
}

void listarVenda(){
    int i;
    if (indiceVenda == -1 ){
        puts("Nao existem vendas realizadas ");
    }
    for (i = 0 ; i <= indiceVenda ; i++){
        printf("Codigo do cliente: %d\n", vendas[i].codigo_cliente);
        printf("Codigo do remedio: %d\n", vendas[i].codigo_remedio);
        printf("Nome do Remedio: %s\n", remedios[i].nome);

    }

}

int naoExisteClienteCadastrado(int codigo){
    int naoExisteCliente = 1;
    int i;
    for (i = 0 ; i <= indiceCliente ; i++){
        if (clientes[i].codigo == codigo){
            naoExisteCliente = 0;
            break;
        }
    }
    return naoExisteCliente;
}

void realizarVenda(){
    if (indiceVenda == TAMANHO - 1){
        puts("Nao eh possivel cadastrar mais vendas");
        return;
    }

    //Ler codigo de cliente
    Venda venda;
    puts("Digite o codigo do cliente");
    scanf("%d", &venda.codigo_cliente);

    //Cliente nao existente
    if (naoExisteClienteCadastrado(venda.codigo_cliente)){
        puts("Cliente nao existente");
        return;
    }

    //Ler codigo de remedio
    puts("Digite o codigo do Remedio");
    scanf("%d", &venda.codigo_remedio);

    //remedio nao existente
    int existeRemedio = 0;
    int i;
    for (i = 0 ; i <= indiceRemedio ; i++){
        if (remedios[i].codigo == venda.codigo_remedio){
            existeRemedio = 1;
            break;
        }
    }
    if (existeRemedio == 0){
        puts("Remedio nao existente");
        return;
    }



    indiceVenda++;
    vendas[indiceVenda] = venda;

puts("Venda realizada com Sucesso\n");
}

void cadastraCliente(){
    system("cls");
    if (indiceCliente == TAMANHO - 1){
        puts("Nao eh possivel cadastrar mais clientes");
        return;
    }

    indiceCliente++;
    Cliente cliente;
    FILE *cadastro;
     if ((cadastro=fopen("clientes.txt","a+"))==NULL)
{
printf ("Arquivo n pode ser aberto");
system ("pause");
exit (0);
}

printf("Digite um codigo para um cliente: \n");
fflush (stdin);
scanf ("%d", &cliente.codigo);
fwrite( &cliente.codigo, sizeof(int),1, cadastro);
printf ("Digite o nome do cliente: \n");
fflush (stdin);
gets (cliente.nome);
strcat (cliente.nome,"\n");
fputs(cliente.nome, cadastro);

    //Codigo para teste
    //printf("Codigo lido do teclado: %d\n", cliente.codigo);
    //printf("Nome lido do teclado: %s\n", cliente.nome);

    clientes[indiceCliente] = cliente;


}
void listarCliente(){
    system("cls");
    int i;
    if (indiceCliente == -1 ){
        puts("Nao existem clientes cadastrados");
    }
    for (i = 0 ; i <= indiceCliente ; i++){
        printf("Codigo do cliente: %d\n", clientes[i].codigo);
        printf("Nome do cliente: %s\n", clientes[i].nome);
    }
}


void cadastraRemedio(){
    system("cls");
    if (indiceRemedio == TAMANHO - 1){
        puts("Nao eh possivel cadastrar mais Remedio");
        return;
    }

    indiceRemedio++;
    Remedio remedio;
    FILE *cadastro2;

   if ((cadastro2=fopen("remedio.txt","a+"))==NULL)
   {
   printf ("Arquivo n pode ser aberto");
   system ("pause");
   exit (0);
   }
    printf("Digite um codigo para o remedio\n");
    fflush (stdin);
    scanf ("%d",&remedio.codigo);
    fwrite(&remedio.codigo, sizeof(int),1, cadastro2);
    printf ("Digite o nome do remedio\n");
    fflush (stdin);
    gets (remedio.nome);
    strcat (remedio.nome,"\n");
    fputs(remedio.nome, cadastro2);
    printf ("Digite o preco da conta por mes\n");
    fflush (stdin);
    scanf ("%f",&remedio.preco);
    fclose(cadastro2);

    //Codigo para teste
    //printf("Codigo lido do teclado: %d\n", cliente.codigo);
    //printf("Nome lido do teclado: %s\n", cliente.nome);

    remedios[indiceRemedio] = remedio;


}
void listarRemedio(){
    system("cls");
    int i;
    if (indiceRemedio == -1 ){
        puts("Nao existem Remedio cadastrados");
    }
    for (i = 0 ; i <= indiceRemedio ; i++){
        printf("Codigo do remedio: %d\n", remedios[i].codigo);
        printf("Nome do remedio: %s\n", remedios[i].nome);
        printf("Preco do remedio: %f\n", remedios[i].preco);
    }

}

void deletarCliente(){
remove("clientes.txt");
puts("ARQUIVO DELETADO COM SUCESSO\n");
system("pause");
system("cls || clear");
}

void deletarRemedio(){
remove("remedio.txt");
puts("ARQUIVO DELETADO COM SUCESSO\n");
system("pause");
system("cls || clear");
}
